/**
 * 883. 三维形体投影面积
 * https://leetcode-cn.com/problems/projection-area-of-3d-shapes/
 */
public class Solutions_883 {
    public static void main(String[] args) {
//        int[][] grid = {{2}};  // output: 5
//        int[][] grid = {{1, 2}, {3, 4}};  // output: 17
//        int[][] grid = {{1, 0}, {0, 2}};  // output: 8
//        int[][] grid = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};  // output: 14
        int[][] grid = {{2, 2, 2}, {2, 1, 2}, {2, 2, 2}};  // output: 21

        int result = projectionArea(grid);
        System.out.println(result);
    }

    public static int projectionArea(int[][] grid) {
        int x = 0, y = 0, z = 0;
        int row = grid.length;

        // 计算顶部阴影（从上往下看，能够看到的立方体个数）
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < row; j++) {
                if (grid[i][j] > 0) {
                    z ++;
                }
                // 不采用这里使用 Math.max 比较的方法
            }
        }
        // 计算前面阴影（从前往后看，能够看到的立方体个数），转化为求每列的最大值
        // 计算侧面阴影（从左往右看，能够看到的立方体个数），转化为求每行的最大值
        for (int i = 0; i < row; i++) {
            // 行与列的数量相同
            y += getRowMax(grid, i);
            x += getColMax(grid, i);
        }
        // 三个面的全部阴影面积
        return x + y + z;
    }

    /**
     * 比较 grid 中 row 行里的最大值
     */
    public static int getRowMax(int[][] grid, int row) {
        // 获取到第 row 行
        int[] r = grid[row];
        int max = 0;
        for (int i : r) {
            max = Math.max(max, i);
        }
        return max;
    }

    /**
     * 比较 grid 中 col 列里的最大值
     */
    public static int getColMax(int[][] grid, int col) {
        int max = 0;
        for (int[] r : grid) {
            max = Math.max(max, r[col]);
        }
        return max;
    }
}
